android SharedPreferences详解

在android的使用过程中,本地缓存数据有多种方式,其中有一种方式用于保存key-value的数据形式,那就是 -- SharedPreferences。

下面我们就来详细解读一下SharedPreferences的使用。

创建SharedPreferences有三种方式:

1.Activity.getPreferences(Mode)

2.Context.getSharedPreferences(name,mode)

3.通过PreferencesManager来获取

下面我们就来依次讲解一下,通过每一种方式来获取SharedPreferences的区别:


在讲怎么创建SharedPreferences之前,我们来看一看每一种创建方式中都有mode参数,我们就先来对这个mode参数做一个详解;mode是Context中的静态常量,有4种

1.MODE_PRIVATE 文件存在每一次对文件的操作,都会对文件进行覆盖,否则创建新文件。

2.MODE_APPEND 如果文件存在,则会往文件中追加记录,否则创建新文件(常用)

3.MODE_WORLD_READABLE

4.MODE_WORLD_WRITEABLE

从API 17开始MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE已经被注释了,不建议使用。如果要共享文件,可以通过ContentProvider的方式来实现。


好了,讲解了Mode之后,我们来看看每一种创建SharedPreferences的区别。


一、Activity.getPreferences(mode)

通过Activity.getPreferences()的方式来获取SharedPreferences很简单,只需要在Activity中调用

SharedPreferences preferences = getPreferences(MODE_APPEND);
创建过后,我们往其中存放数据。

// 往apreferences存放数据
SharedPreferences.Editor editor1 = apreferences.edit();
editor1.putString("key", "apreferences");
editor1.putString("mode", "append");
editor1.commit(); // 提交数据

记住一定要commit();否则将没法将数据放入文件中。


我们在Main.Activity和Test.Activity中分别通过上面的方式来创建和保存数据,然后进入文件目录,查看创建的SharedPreferences目录文件(/data/data/<包名>/shared_prefs/)


我们会发现,创建了两个文件,并且分别以Activity的名称来作为的文件名。并且进一步实验会发现在MainActivity中插入的数据,在TestActivity中通过Activity.getPreferences的方式创建的SharedPreferences无法获取到数据。

我们追踪源代码,会发现,其实通过Activity.getPreferences()的方式来创建SharedPreferences还是调用的Context.getSharedPreferences来创建的SharedPreferences。

public SharedPreferences getPreferences(int mode) {
    return getSharedPreferences(getLocalClassName(), mode);
}
</pre><pre name="code" class="java"><pre name="code" class="java">@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
    return mBase.getSharedPreferences(name, mode);
}

 只是通过Activity的方式来创建的时候,文件名是调用的getLocalClassName()传递的。 

下面具体来看看getLocalClassName()方法,为了方便理解,我把Activity里的getLocalClassName()复制出来,加上注释和日志:

public String getLocalClassName() {
    // 获取包名
    final String pkg = getPackageName();
    Log.i("TAG", "pkg --> " + pkg);
    // 获取当前类的名称[包括包名]
    final String cls = getIntent().getComponent().getClassName();
    Log.i("TAG", "cls --> " + cls);
    int packageLen = pkg.length();
    if (!cls.startsWith(pkg) || cls.length() <= packageLen
        || cls.charAt(packageLen) != '.') {
        return cls;
    }
    return cls.substring(packageLen+1);
}
我们可以看到系统是通过包名和类名来构建的,因为同一个包下不可能出现重复名称的Activity,所以这样能保证,每一个Activity能够对应一个SharedPreferences。


在实际中一般都不会通过Activity的方式来创建SharedPreferences,我们一般都是通过Context的方式来创建SharedPreferences的,下面我们就来看看通过Context的方式来获取SharedPreferences。

二、Context.getSharedPreferences()

了解了上面的过后,下面的就比较简单了,直接看代码:

// 获取SharedPreferences
cpreferences1 = getSharedPreferences("test", MODE_APPEND);
// 插入数据
SharedPreferences.Editor editor = cpreferences1.edit();
editor.putString("key", "key");
editor.putString("value", "value");
editor.commit(); // 提交

通过Context的方式创建的preferences文件,在本应用的其它地方只要传入的文件名相同,都能获取到。 这个也是最常用的方式。


三、PreferencesManager

通过PreferencesManager来获取SharedPreferences很简单。

// 通过PreferenceManager获取
cpreferences2 = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor2 = cpreferences2.edit();
editor2.putString("key", "key");
editor2.putString("value", "value");
editor2.commit();

这样,就已经存放了数据了,我们看看存放的文件名



可以看到文件名是:com.gavin.preferences_preferences.xml。接下来,我们通过源代码来看看文件名的构成方式。

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}


private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}
可以看到,PreferencesManager中是通过获取应用包名然后拼接上 "_preferences" 来作为为配置文件名。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值